from abc import ABCMeta,abstractmethod

'''
采取中间类，继承抽象类，把所需要适配的类，在抽象方法里进行使用
'''

#目标接口
class Payment(metaclass=ABCMeta):
    # abstract class
    @abstractmethod
    def pay(self,money):
        pass

class Alipay(Payment):
    def pay(self,money):
        print('支付宝支付%d元。' % money)


class WechatPay(Payment):
    def pay(self, money):
        print('微信支付%d元。' % money)

#待适配的类
class BankPay:
    def cost(self, money):
        print('银联支付%d元。' % money)

class ApplePay:
    def cost(self,money):
        print('苹果支付%d元。' % money)

#适配器
#   类适配器（使用多继承）
class NewBankPay(Payment,BankPay):
    def pay(self,money):
        self.cost(money)

p = NewBankPay()
p.pay(100)


#   对象适配器（使用组合）
class PaymentAdapter(Payment):
    def __init__(self,payment):
        self.payment = payment

    def pay(self,money):
        self.payment.cost(money)

p = PaymentAdapter(BankPay())
p.pay(100)